package com.jdk.learn.juc._02cas;

/**
 * Created by baiguantao on 2018/1/31.
 *
 * 演示cas执行过程 底层是依赖硬件支持 这里只是思想
 *
CAS (Compare-And-Swap) 是一种硬件对并发的支持，针对多处理器
 操作而设计的处理器中的一种特殊指令，用于管理对共享数据的并
 发访问。
  CAS 是一种无锁的非阻塞算法的实现。
 CAS 包含了 3 个操作数：
  需要读写的内存值 V
  进行比较的值 A
  拟写入的新值 B
  当且仅当 V 的值等于 A 时，CAS 通过原子方式用新值 B 来更新 V 的
 值，否则不会执行任何操作
 */
public class TestCompareAndSwap {
    public static void main(String[] args) {
        CAS cas=new CAS();
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                int value=cas.getValue();
                boolean b = cas.compareAndSet(value, (int) (Math.random() * 100));
                System.out.println(b);
            }).start();
        }
    }
}

class CAS {

   private  int value;
   //获取内存值   真实cas使用的不是synchronized
    public synchronized int getValue(){
        return value;
    }

    /**
     * 比较和交换
     * @param expValue
     * @param newValue
     * @return
     */
    public synchronized int compareAndSwap(int expValue,int newValue){
        int oldVal=value;
        if (oldVal==expValue) {
            this.value=newValue;
        }
        return oldVal;
    }


    /**
     * 比较和设置  查看是否设置成功
     */

    public synchronized boolean compareAndSet(int expValue,int newValue){
        return expValue==compareAndSwap(expValue,newValue);
    }
}
